package com.lis.thread;




import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/*
多线程的第三种创建方式：利用Callable接口、FutureTask类来实现。
    实现步骤
        1创建任务对象
            定义一个类实现CaLlabLe接口，重写caLL方法，封装要做的事情，和要返回的数据。
            把CallabLe类型的对象封装成FutureTask（ 线程任务对象）。
        2 把线程任务对象交给Thread对象。
        3 调用Thread对象的start方法启动线程。
        4 线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果。

    方式三优缺点：
        优点：线程任务类只是实现接口，可以继续继承类和实现接口，扩展性强：可以在线程执行完毕后去获取线程执行的结果。
        缺点：编码复杂一点。
*/
public class ThreadDemo3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //3 创建任务类对象
        MyCallable callable = new MyCallable();


        //4 定义桥梁
        FutureTask<String> futureTask = new FutureTask<>(callable);
        //5 创建线程对象
        Thread thread = new Thread(futureTask);

        //6 开启线程
        thread.start();

        //get 方法获取线程执行返回的结果值
        String result = futureTask.get(); //阻塞进程 !!!!
        System.out.println(result);



    }
}
//1 创建任务类实现 Callable 接口
class MyCallable implements Callable<String> {
    //2 重写 call
    @Override
    public String call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println("新线程:"+i);
        }
        return "Finsh";
    }


}


